﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using System.Web.Mvc;
using log4net;
using TheBullysStore.Models.ModuloAdministracion.Departamento;
using TheBullysStore.Models.ModuloAdministracion.DepartamentoPeru;
using TheBullysStore.Models.ModuloAdministracion.DistritoPeru;
using TheBullysStore.Models.ModuloAdministracion.Edificio;
using TheBullysStore.Models.ModuloAdministracion.ProvinciaPeru;
using TheBullysStore.Models.ModuloServicios.EstadoCuenta;
using TheBullysStore.Models.ModuloAdministracion.Usuario;

namespace TheBullysStore.Controllers.ModuloServicio
{
    public class VisualizarEstadoCuentaController : Controller
    {
        //
        // GET: /VisualizarEstadoCuenta/
        private static ILog log = LogManager.GetLogger(typeof(VisualizarEstadoCuentaController));
        DepartamentoPeruDAO departamentoPeruDAO = new DepartamentoPeruDAO();
        ProvinciaPeruDAO provinciaPeruDAO = new ProvinciaPeruDAO();
        DistritoPeruDAO distritoPeruDAO = new DistritoPeruDAO();
        EstadoCuentaDAO estadoCuentaDAO = new EstadoCuentaDAO();
        EdificioDAO edificioDAO = new EdificioDAO();

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult VisualizarEstadoCuenta()
        {
            return View();
        }

        public ActionResult EstadoCuenta()
        {
            return View();
        }

        public ActionResult HistorialPagos()
        {
            return View();
        }

        public ActionResult SubirComprobante()
        {
            return View();
        }

        public ActionResult VerComprobante()
        {
            return View();
        }

        public ActionResult VisualizarComprobante() {
            return View();
        }

        [HttpPost]
        public JsonResult cargarDepartamentosLugar(DepartamentoPeruBean departamento)
        {
            try
            {
                List<DepartamentoPeruBean> listaDepartamentoPeru = departamentoPeruDAO.ListarDepartamentoPeru(departamento);
                return Json(new { listaDepartamentoPeru });
            }
            catch (Exception ex)
            {
                log.Error("cargarDepartamentosLugar - GET(EXCEPTION):", ex);
                return Json(new { listaDepartamentoPeru = "Ocurrió un error al buscar" });
            }
        }

        [HttpPost]
        public JsonResult cargarProvincias(DepartamentoPeruBean departamento)
        {
            try
            {
                List<ProvinciaPeruBean> listaProvinciaPeru = provinciaPeruDAO.ListarProvinciaPeru(departamento);
                return Json(new { listaProvinciaPeru });
            }
            catch (Exception ex)
            {
                log.Error("cargarProvincias - GET(EXCEPTION):", ex);
                return Json(new { listaProvinciaPeru = "Ocurrió un error al buscar" });
            }
        }

        [HttpPost]
        public JsonResult cargarDistritos(ProvinciaPeruBean provincia)
        {
            try
            {
                List<DistritoPeruBean> listaDistritoPeru = distritoPeruDAO.ListarDistritoPeru(provincia);
                return Json(new { listaDistritoPeru });
            }
            catch (Exception ex)
            {
                log.Error("cargarDistritos - GET(EXCEPTION):", ex);
                return Json(new { listaDistritoPeru = "Ocurrió un error al buscar" });
            }
        }
        
        [HttpPost]
        public JsonResult cargarEdificios(EdificioBean edificio)
        {
            try
            {
                List<EdificioBean> listaEdificio = estadoCuentaDAO.ListarEdificio(edificio);
                return Json(new { listaEdificio });
            }
            catch (Exception ex)
            {
                log.Error("cargarEdificios - GET(EXCEPTION):", ex);
                return Json(new { listaEdificio = "Ocurrió un error al buscar" });
            }
        }

        [HttpPost]
        public JsonResult cargarPisos(EdificioBean edificio)
        {
            try
            {
                List<int> listaPiso = edificioDAO.ListarPiso(edificio);
                return Json(new { listaPiso });
            }
            catch (Exception ex)
            {
                log.Error("cargarPisos - GET(EXCEPTION):", ex);
                return Json(new { listaPiso = "Ocurrió un error al buscar" });
            }
        }

        [HttpPost]
        public JsonResult cargarDepartamentos(DepartamentoBean departamento)
        {
            try
            {
                List<DepartamentoBean> listaDepartamentos = estadoCuentaDAO.ListarDepartamentos(departamento);
                return Json(new { listaDepartamentos });
            }
            catch (Exception ex)
            {
                log.Error("cargarDepartamentos - GET(EXCEPTION):", ex);
                return Json(new { listaDepartamentos = "Ocurrió un error al buscar" });
            }
        }

        [HttpPost]
        public JsonResult buscarPropietarios(EstadoCuentaBean estadoCuenta)
        {
            try
            {
                List<EstadoCuentaBean> listaPropietarios = estadoCuentaDAO.ListarPropietarios(estadoCuenta);
                return Json(new { listaPropietarios });
            }
            catch (Exception ex)
            {
                log.Error("buscarPropietarios - GET(EXCEPTION):", ex);
                return Json(new { listaPropietarios = "Ocurrió un error al buscar" });
            }
        }

        [HttpPost]
        public JsonResult verDetalleEstadoCuenta(EstadoCuentaBean estadoCuenta)
        {
            try
            {
                List<EstadoCuentaBean> ListaEstadoCuenta = estadoCuentaDAO.ListarEstadoCuentaA(estadoCuenta);
                return Json(new { ListaEstadoCuenta });
            }
            catch (Exception ex)
            {
                log.Error("verDetalleEstadoCuenta - GET(EXCEPTION):", ex);
                return Json(new { ListaEstadoCuenta = "Ocurrió un error al buscar" });
            }
        }

        [HttpPost]
        public JsonResult verDetalleHistorialPagos(EstadoCuentaBean estadoCuenta)
        {
            try
            {
                List<EstadoCuentaBean> ListaHistorialPagos = estadoCuentaDAO.ListarHistorialPagosA(estadoCuenta);
                return Json(new { ListaHistorialPagos });
            }
            catch (Exception ex)
            {
                log.Error("verDetalleHistorialPagos - GET(EXCEPTION):", ex);
                return Json(new { ListaHistorialPagos = "Ocurrió un error al buscar" });
            }
        }

        [HttpPost]
        public JsonResult buscarEstadoCuentaP(EstadoCuentaBean estadoCuenta)
        {
            try
            {
                List<EstadoCuentaBean> ListaEstadoCuenta = estadoCuentaDAO.ListarEstadoCuentaP(estadoCuenta);
                return Json(new { ListaEstadoCuenta });
            }
            catch (Exception ex)
            {
                log.Error("buscarEstadoCuentaP - GET(EXCEPTION):", ex);
                return Json(new { ListaEstadoCuenta = "Ocurrió un error al buscar" });
            }
        }
        

        [HttpPost]
        public JsonResult buscarHistorialPagosP(EstadoCuentaBean estadoCuenta)
        {
            try
            {
                List<EstadoCuentaBean> ListaHistorialPagos = estadoCuentaDAO.ListarHistorialPagosP(estadoCuenta);
                return Json(new { ListaHistorialPagos });
            }
            catch (Exception ex)
            {
                log.Error("buscarHistorialPagosP - GET(EXCEPTION):", ex);
                return Json(new { ListaHistorialPagos = "Ocurrió un error al buscar" });
            }
        }

        [HttpPost]
        public JsonResult buscarDatos(UsuarioBean persona)
        {
            try
            {
                List<UsuarioBean> datos = estadoCuentaDAO.buscarDatos(persona);
                return Json(new { datos });
            }
            catch (Exception ex)
            {
                log.Error("buscarDatos - GET(EXCEPTION):", ex);
                return Json(new { datos = "Ocurrió un error al buscar" });
            }
        }

        [HttpPost]
        public JsonResult buscarVC(EstadoCuentaBean estadoCuenta)
        {
            try
            {
                List<EstadoCuentaBean> datos = estadoCuentaDAO.buscarVC(estadoCuenta);
                return Json(new { datos });
            }
            catch (Exception ex)
            {
                log.Error("buscarVC - GET(EXCEPTION):", ex);
                return Json(new { datos = "Ocurrió un error al buscar" });
            }
        }

        [HttpPost]
        public JsonResult confirmarPago(EstadoCuentaBean estadoCuenta)
        {
            try
            {
                List<EstadoCuentaBean> datos = estadoCuentaDAO.confirmarPagoCV(estadoCuenta);
                return Json(new { datos });
            }
            catch (Exception ex)
            {
                log.Error("confirmarPago - GET(EXCEPTION):", ex);
                return Json(new { datos = "Ocurrió un error al buscar" });
            }
        }

        //**************************************** subir imagenes *********************************

        private string StorageRoot
        {
            get { return Path.Combine(Server.MapPath("~/Files")); }
        }

        //DONT USE THIS IF YOU NEED TO ALLOW LARGE FILES UPLOADS
        [HttpGet]
        public void Delete(string id)
        {
            var filename = id;
            var filePath = Path.Combine(Server.MapPath("~/Files"), filename);

            if (System.IO.File.Exists(filePath))
            {
                System.IO.File.Delete(filePath);
            }
        }

        //DONT USE THIS IF YOU NEED TO ALLOW LARGE FILES UPLOADS
        [HttpGet]
        public void Download(string id)
        {
            var filename = id;
            var filePath = Path.Combine(Server.MapPath("~/Files"), filename);

            var context = HttpContext;

            if (System.IO.File.Exists(filePath))
            {
                context.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
                context.Response.ContentType = "application/octet-stream";
                context.Response.ClearContent();
                context.Response.WriteFile(filePath);
            }
            else
                context.Response.StatusCode = 404;
        }

        //DONT USE THIS IF YOU NEED TO ALLOW LARGE FILES UPLOADS
        [HttpPost]
        public ActionResult UploadFiles()
        {
            var r = new List<ViewDataUploadFilesResult>();

            foreach (string file in Request.Files)
            {
                var statuses = new List<ViewDataUploadFilesResult>();
                var headers = Request.Headers;
                var IdDepartamento = Request.Form["RegTbxDepartamento"];

                if (string.IsNullOrEmpty(headers["X-File-Name"]))
                {
                    UploadWholeFile(Request, statuses);
                }
                else
                {
                    UploadPartialFile(headers["X-File-Name"], Request, statuses);
                }

                JsonResult result = Json(statuses);
                result.ContentType = "text/plain";

                return result;
            }

            return Json(r);
        }

        private string EncodeFile(string fileName)
        {
            return Convert.ToBase64String(System.IO.File.ReadAllBytes(fileName));
        }

        //DONT USE THIS IF YOU NEED TO ALLOW LARGE FILES UPLOADS
        //Credit to i-e-b and his ASP.Net uploader for the bulk of the upload helper methods - https://github.com/i-e-b/jQueryFileUpload.Net
        private void UploadPartialFile(string fileName, HttpRequestBase request, List<ViewDataUploadFilesResult> statuses)
        {
            if (request.Files.Count != 1) throw new HttpRequestValidationException("Attempt to upload chunked file containing more than one fragment per request");
            var file = request.Files[0];
            var inputStream = file.InputStream;

            var fullName = Path.Combine(StorageRoot, Path.GetFileName(fileName));

            using (var fs = new FileStream(fullName, FileMode.Append, FileAccess.Write))
            {
                var buffer = new byte[1024];

                var l = inputStream.Read(buffer, 0, 1024);
                while (l > 0)
                {
                    fs.Write(buffer, 0, l);
                    l = inputStream.Read(buffer, 0, 1024);
                }
                fs.Flush();
                fs.Close();
            }
            statuses.Add(new ViewDataUploadFilesResult()
            {
                name = fileName,
                size = file.ContentLength,
                type = file.ContentType,
                url = "/Home/Download/" + fileName,
                delete_url = "/Home/Delete/" + fileName,
                thumbnail_url = @"data:image/png;base64," + EncodeFile(fullName),
                delete_type = "GET",
            });
        }

        //DONT USE THIS IF YOU NEED TO ALLOW LARGE FILES UPLOADS
        //Credit to i-e-b and his ASP.Net uploader for the bulk of the upload helper methods - https://github.com/i-e-b/jQueryFileUpload.Net
        private void UploadWholeFile(HttpRequestBase request, List<ViewDataUploadFilesResult> statuses)
        {
            for (int i = 0; i < request.Files.Count; i++)
            {
                var file = request.Files[i];

                var fullPath = Path.Combine(StorageRoot, Path.GetFileName(file.FileName));

                file.SaveAs(fullPath);

                statuses.Add(new ViewDataUploadFilesResult()
                {
                    name = file.FileName,
                    size = file.ContentLength,
                    type = file.ContentType,
                    url = "/Home/Download/" + file.FileName,
                    delete_url = "/Home/Delete/" + file.FileName,
                    thumbnail_url = @"data:image/png;base64," + EncodeFile(fullPath),
                    delete_type = "GET",
                });
            }
        }
    }

    public class ViewDataUploadFilesResult
    {
        public string name { get; set; }
        public int size { get; set; }
        public string type { get; set; }
        public string url { get; set; }
        public string delete_url { get; set; }
        public string thumbnail_url { get; set; }
        public string delete_type { get; set; }
        public string IdDepartamento { get; set; }
    }
}
